Formatos de audio y librerías para el tratamiento de la señal de audio en Python¶

Procesamiento de Imagen y Señal¶

In [1]:
import sys
import os

#sys.path.append('..')

##

import warnings
warnings.filterwarnings('ignore')

##

import IPython.display as ipd

import matplotlib.pyplot as plt
import matplotlib.image as im
import numpy as np

#### Important tips
# To hear the signal
# ipd.Audio(x, rate=fs)
####

# Funciones auxiliares
path = "code/"

# Add the directory containing your module to the Python path (wants absolute paths)
sys.path.append(os.path.abspath(path))

from f_plot import *

Librerías para el tratamiento de la señal de audio en Python¶

LibROSA¶

Una opción para leer audio es utilizar la función de la librería LibROSA: librosa.load().

  • Por defecto, librosa.load() remuestrea la señal de audio a $22050~\mathrm{Hz}$. Si se selecciona la opción sr=None, se mantiene la frecuencia de muestreo original.
  • La señal de audio se convierte a un float con valores de amplitud en el rango de $[-1, 1]$.
  • La función librosa.load() utiliza el paquete PySoundFile o audioread.
    • Cuando se lee una señal de audio, se intenta utilizar el paquete PySoundFile. Esto funciona para muchos formatos como WAV, FLAC y OGG.
    • Sin embargo, no se puede leer señales de audio en formato MP3.
    • Si el paquete PySoundFile no puede leer la señal de audio (por ejemplo, MP3), se emite una advertencia y se utiliza la biblioteca audioread.
    • Cuando está disponible ffmpeg esta biblioteca puede leer archivos MP3.
In [2]:
import librosa

# Lee wav
fn_wav = os.path.join('audio_formatos/', 'noteC4_Piano.wav')
x, fs = librosa.load(fn_wav, sr=None)
print_plot_play(x, fs, text='Fichero WAV: ')

# Lee mp3
fn_mp3 = os.path.join('audio_formatos/', 'noteC4_Piano.mp3')
x, fs = librosa.load(fn_mp3, sr=None)
print_plot_play(x, fs, text='Fichero MP3: ')
Fichero WAV:  Fs = 11025, x.shape = (45504,), x.dtype = float32
No description has been provided for this image
Your browser does not support the audio element.
Fichero MP3:  Fs = 11025, x.shape = (47232,), x.dtype = float32
No description has been provided for this image
Your browser does not support the audio element.

PySoundFile¶

La biblioteca de audio PySoundFile ofrece funciones para leer y escribir archivos de sonido. En particular, contiene las funciones soundfile.read() y soundfile.write().

  • Por defecto, el audio se convierte a un float con valores de amplitud situados en el rango de $[-1, 1]$. Este valor por defecto puede cambiarse usando la palabra clave dtype.
  • Cuando se escribe, se utiliza, por defecto, PCM de $16$ bits con signo (subtype='PCM_16').
  • No hay opciones de remuestreo.
  • No se pueden leer ficheros MP3.
In [3]:
import soundfile as sf

# Lee wav
fn_wav = os.path.join('audio_formatos/', 'noteC4_Piano.wav')
x, fs = sf.read(fn_wav)
print_plot_play(x, fs, text='Fichero WAV (por defecto): ')

# Lee wav con dtype= 'int16'
x, fs = sf.read(fn_wav, dtype= 'int16')
print_plot_play(x, fs, text='Fichero WAV (dtype=int16): ')

# Escribe la senal 'int16' y lee la senal por defecto
fn_out = os.path.join('www/', 'noteC4_Piano_int16.wav')
sf.write(fn_out, x, fs)
x, Fs = sf.read(fn_out)
print_plot_play(x, fs, text='Escribe una señal (int16) y lee posteriormente esta señal (por defecto): ')
Fichero WAV (por defecto):  Fs = 11025, x.shape = (45504,), x.dtype = float64
No description has been provided for this image
Your browser does not support the audio element.
Fichero WAV (dtype=int16):  Fs = 11025, x.shape = (45504,), x.dtype = int16
No description has been provided for this image
Your browser does not support the audio element.
Escribe una señal (int16) y lee posteriormente esta señal (por defecto):  Fs = 11025, x.shape = (45504,), x.dtype = float64
No description has been provided for this image
Your browser does not support the audio element.
In [4]:
# Genera una senal
fs = 8000
x = 0.5 * np.cos(2 * np.pi * 440 * np.arange(0, fs) / fs)
x[2000:2200] = 2
print_plot_play(x, fs, text='Señal generada: ')

# Escribe una senal
# Por defecto: 'PCM_16'
# Es equivalente a preprocesar (dithering + quantization) 
# x = np.int16(np.round(x*(2**15)))
# 
print('Escribe el fichero (por defecto):', sf.default_subtype('WAV'))
fn_out = os.path.join('www/', 'audio_sine.wav')
sf.write(fn_out, x, fs, subtype='PCM_16')

# Lee la senal generada
x, fs = sf.read(fn_out)
print_plot_play(x, fs, text='Señal después de ser escrita y leeida: ')
Señal generada:  Fs = 8000, x.shape = (8000,), x.dtype = float64
No description has been provided for this image
Your browser does not support the audio element.
Escribe el fichero (por defecto): PCM_16
Señal después de ser escrita y leeida:  Fs = 8000, x.shape = (8000,), x.dtype = float64
No description has been provided for this image
Your browser does not support the audio element.

SciPy¶

La librería Scipy ofrece el módulo scipy.io.wavfile(), que permite leer y escribir archivos de tipo wav. Sin embargo, no todas las variantes del formato wav son compatibles. Por ejemplo, no se admiten archivos WAV de $24$ bits enteros. Además, determinados campos de metadatos de un archivo wav también pueden dar lugar a errores. Por lo tanto, no recomendamos esta opción.

In [5]:
from scipy.io import wavfile

fn_wav = os.path.join('audio_formatos/', 'noteC4_Piano.wav')
fs, x = wavfile.read(fn_wav)
print_plot_play(x, fs, text='Señal leida: ')
Señal leida:  Fs = 11025, x.shape = (45504,), x.dtype = int16
No description has been provided for this image
Your browser does not support the audio element.

libfmp¶

Esta librería incluye algunas funciones para leer y escribir señales de audio: utiliza la librería librosa para cargar los ficheros de audio y la librería PySoundFile para escribir audio.

In [6]:
import libfmp.b

fn_wav = os.path.join('audio_formatos/', 'noteC4_Piano.wav')
fn_out = os.path.join('www/', 'noteC4_Piano.b.wav')

x, fs = libfmp.b.read_audio(fn_wav)
libfmp.b.write_audio(fn_out, x, fs)
x, fs = libfmp.b.read_audio(fn_out)
print_plot_play(x, fs, text='Señal después de ser escrita y leida: ')
Señal después de ser escrita y leida:  Fs = 11025, x.shape = (45504,), x.dtype = float32
No description has been provided for this image
Your browser does not support the audio element.

Otras librerías¶

Librería PyAudio: Se utiliza para la entrada y salida de audio y puede generar tonos de una frecuencia específica manipulando transmisiones de audio. Proporciona enlaces de Python para PortAudio, la API de audio multiplataforma.

Librería Simpleaudio: Esta es una biblioteca sencilla para reproducir archivos WAV o matrices NumPy. Puedes crear un sonido a una determinada frecuencia y reproducirlo.

Librería Sounddevice: Esta biblioteca proporciona enlaces para la biblioteca PortAudio y se puede usar para reproducir y grabar sonido en un formato de matriz NumPy, lo que permite un control preciso sobre la frecuencia.

Librería Wave: Parte de la biblioteca estándar de Python, se usa para leer y escribir archivos WAV. Puede usarse en combinación con otras bibliotecas como Numpy para generar tonos de frecuencias específicas y guardarlos.

Librería mir_eval: Esta biblioteca proporciona funciones para los sistemas de recuperación de información musical (Music Information Retrieval, MIR).


Formatos de audio¶

Existe un gran número de formatos de audio en la actualidad.

The evolution of physical music formats

How we listen a timeline of audio formats

Timeline of audio formats

MP3¶

El formato MPEG-1 Audio Layer III o MPEG-2 Audio Layer III es el formato de compresión de audio más utilizado debido a su extraordinario grado de compresión y alta calidad.

  • Velocidad de muestreo de archivos MPEG-1: 32, 44.1 y 48 kHz.
  • Velocidad de muestreo de archivos MPEG-2: 16, 22.05 y 24 kHz.

El umbral mínimo de audición humano no es lineal. De acuerdo con la ley de Fletcher y Munsen, se representa por una curva entre $2$ y $5$ KHz. Cualquier sonido situado fuera de este margen puede no codificarse, ya que no será percibido de todas formas. El proceso de codificación utilizado en MP3 se denomina “codificación perceptual” y se basa en eliminar aquellos datos que no serán percibidos por el oyente debido a las pequeñas imperfecciones del oído humano. La base matemática es muy compleja y conlleva un proceso de cómputo lento.

Aplicando las técnicas del MP3, se consigue reducir el tamaño que ocupa una pieza musical en un factor entre $10(12):1$.

WAV¶

WAV (Waveform Audio File Format) es un formato creado por Microsoft que, normalmente, no realiza una compresión de datos. Si se utiliza compresión, se suelen usar los algoritmos de codificación PCM (Pulse Code Modulation) o ADPCM (Adaptive Differential Pulse Code Modulation). Admite archivos mono y estéreo a diversas resoluciones y velocidades de muestreo.

Es un formato que aporta una excelente calidad pero genera ficheros de gran tamaño. Cada muestra de audio se guarda como un número entero de 16 bits (a veces en 32 bits). Esto es, los sonidos con extensión WAV (.wav) son sonidos con una calidad muy buena, concretamente, su calidad es unas 13 veces inferior a un sonido original. Por tanto, consigue una compresión de excelente calidad pero genera ficheros de gran tamaño. Por ejemplo, una canción extraída de un CD, a $16$ bytes, $44100$ Hz y estéreo, puede ocupar entre $20$ y $30$ MB.


Ejemplo 1¶

  • LRMonoPhase4.wav (Left, Right, In-Phase, Out-Of-Phase Test, 48k/16, WAV, 7.3MB, 39 segundos). Grabado con un micrófono de cinta RCA BK-5b (ribbon micro), un mezclador FP-24 y un Mac PowerBook.
No description has been provided for this image
In [7]:
audio, fs = librosa.load("audio_formatos/Ejemplo1/LRMonoPhase4.wav")
plot_ss(x=audio, fs=fs, titulo='LRMonoPhase4.wav');
ipd.Audio(audio, rate=fs)
No description has been provided for this image
Out[7]:
Your browser does not support the audio element.
  • LRMonoPhase4.mp3. La misma señal en formato MP3.
In [8]:
audio, fs = librosa.load("audio_formatos/Ejemplo1/LRMonoPhase4.mp3")
plot_ss(x=audio, fs=fs, titulo='LRMonoPhase4.mp3');
ipd.Audio(audio, rate=fs)
No description has been provided for this image
Out[8]:
Your browser does not support the audio element.

Ejemplo 2¶

  • WAV-MP3.wav (11 segundos, cambia de WAV 44100Hz sin comprimir a MP3 11000Hz)
In [9]:
audio, fs = librosa.load("audio_formatos/Ejemplo3/WAV-MP3.wav")
plot_ss(x=audio, fs=fs, titulo='WAV-MP3.wav');
ipd.Audio(audio, rate=fs)
No description has been provided for this image
Out[9]:
Your browser does not support the audio element.
  • organfinale.wav (Solo de órgano, 13 segundos, WAV, 44100Hz/32-bit, estéreo, 4.4MB)
In [10]:
lista_audio = []
lista_fs = []
titulos = []

audio, fs = librosa.load("audio_formatos/Ejemplo3/organfinale.wav")

lista_audio.append(audio)
lista_fs.append(fs)
titulos.append('organfinale.wav')

ipd.Audio(audio, rate=fs)
Out[10]:
Your browser does not support the audio element.
  • organfinale.mp3 (Solo de órgano, 13 segundos, MP3, 44100Hz/32-bit, estéreo, 208KB)
In [11]:
audio, fs = librosa.load("audio_formatos/Ejemplo3/organfinale.mp3")

lista_audio.append(audio)
lista_fs.append(fs)
titulos.append('organfinale.mp3')

ipd.Audio(audio, rate=fs)
plotN_ss(lista_audio, lista_fs, titulos)
No description has been provided for this image
  • 32.mp3 (Click Track, 32 segundos, MP3, 44100Hz/32-bit, mono, 504KB)
In [12]:
audio, fs = librosa.load("audio_formatos/Ejemplo3/32.mp3")
plot_ss(x=audio, fs=fs, titulo='32.mp3');
ipd.Audio(audio, rate=fs)
No description has been provided for this image
Out[12]:
Your browser does not support the audio element.
  • c304-2.wav (Echo test, 49 segundos, WAV, 48k/16, estéreo, 9.1MB)
In [13]:
audio, fs = librosa.load("audio_formatos/Ejemplo3/c304-2.wav")
plot_ss(x=audio, fs=fs, titulo='c304-2.wav');
ipd.Audio(audio, rate=fs)
No description has been provided for this image
Out[13]:
Your browser does not support the audio element.

AIFF¶

El formato AIFF (Audio Interchange File Format) desarrollado por Apple no utiliza compresión y emplea una modulación por impulsos codificados (PCM). Es un formato de alta calidad pero genera ficheros de gran tamaño. Utiliza alrededor de 10 MB para un minuto de audio estéreo con una frecuencia de muestreo de 44.1kHz y 16 bits lo cual genera audios de alta calidad pero de gran tamaño.

Además, este estándar da soporte a bucles para notas musicales para su uso en aplicaciones musicales o samplers.

Ejemplo 2¶

  • piano2.wav (Piano Trill, 48k/16, Little Endian, WAV, estéreo, 1.2MB). 6.3 segundos, siete notas de piano.
In [14]:
lista_audio = []
lista_fs = []
titulos = []

audio, fs = librosa.load("audio_formatos/Ejemplo2/piano2.wav")

lista_audio.append(audio)
lista_fs.append(fs)
titulos.append('piano2.wav')
ipd.Audio(audio, rate=fs)
Out[14]:
Your browser does not support the audio element.
  • piano2.aif (Piano Trill, 48k/16, Big Endian, AIFF, estéreo, 1.2MB). Formato Apple AIFF.
In [15]:
audio, fs = librosa.load("audio_formatos/Ejemplo2/piano2.aif")

lista_audio.append(audio)
lista_fs.append(fs)
titulos.append('piano2.aif')

ipd.Audio(audio, rate=fs)
Out[15]:
Your browser does not support the audio element.
  • piano2-CoolEdit.mp3 (Piano Trill, 48k/128kb-MP3, 100KB). Creado por CoolEdit 2000, Fraunhofer License.
In [16]:
audio, fs = librosa.load("audio_formatos/Ejemplo2/piano2-CoolEdit.mp3")

lista_audio.append(audio)
lista_fs.append(fs)
titulos.append('piano2-CoolEdit.mp3')

ipd.Audio(audio, rate=fs)
Out[16]:
Your browser does not support the audio element.
  • piano2-Audacity1.2.5.mp3 (Piano Trill, 48k/128kb-MP3, 100KB). Creado por lame.
In [17]:
audio, fs = librosa.load("audio_formatos/Ejemplo2/piano2-Audacity1.2.5.mp3")

lista_audio.append(audio)
lista_fs.append(fs)
titulos.append('piano2-Audacity1.2.5.mp3')

ipd.Audio(audio, rate=fs)
plotN_ss(lista_audio, lista_fs, titulos)
No description has been provided for this image

OGG¶

Este formato desarrollado por la Fundación Xiph.org. El formato OGG puede contener audio y vídeo y tiene un grado de compresión similar al MP3 pero, según los expertos en música, la calidad de reproducción es ligeramente superior.

Otros formatos¶

  • AAC (Advanced Audio Coding): Este formato es similar al MP3 aunque más eficiente (menor espacio, misma calidad). Mejor compresión que MP3 especialmente para velocidades de transmisión menores que $128$ kbit/s.
  • HE-AAC (High-Efficiency Advanced Audio Coding): Es una variación de AAC optimizado para velocidades de transmisión bajas (streaming de audio).
  • AMR (Adaptive Multi-Rate): Formato optimizado para voz (velocidad de transmisión baja).
  • ALAC (Apple Lossless): Formato sin pérdida en cualquier calidad y una tasa de compresión del $40-60$ % del tamaño original.
  • iLBC (Internet Low Bitrate Codec): Proporciona una buena calidad de voz y es robusto frente a pérdida de paquetes. Utiliza un algoritmo de predicción lineal adaptativo independiente por bloques.
  • Real Audio: Formato creado por RealNetworks muy utilizado para transmisiones por internet en tiempo real.
  • VQF (TwinVQ, Transform-domain Weighted Interleaved Vector Quantization): Es un formato comercializado por Yamaha. Es menos popular que MP3 pero proporciona menor tamaño, mayor calidad y mayor número de recursos. Son aproximadamente un $30-35$ % más pequeños que los archivos MP3 pero requieren de mayor capacidad de computación que estos.
  • WMA (Windows Media Audio): Este formato, creado por Microsoft, proporciona una mejor calidad de sonido que MP3 a la misma tasa de bits.

Referencias¶

Muchos de los audios utilizados han sido elegidos de la siguiente página: SoundTests.

Formatos de audio¶

  • Formatos de ficheros de audio
  • Comparación entre los formatos de audio
  • Códecs de audio
  • Lista de códecs de audio
  • Diferencia entre WAV y MP3
  • Calidad de sonido MP3 128-320

MP3¶

  • wikipedia MP3
  • Fraunhofer MP3
  • The International Association of Sound and Audiovisual Archives IASA

WAV¶

  • wikipedia WAV

AIFF¶

  • wikipedia AIFF

OGG¶

  • wikipedia OGG

Otros formatos¶

  • wikipedia AAC
  • Fraunhofer AAC
  • wikipedia HE-AAC
  • wikipedia AMR
  • wikipedia ALAC
  • wikipedia iLBC
  • wikipedia Real Audio
  • wikipedia VQF
  • wikipedia WMA

Algunas notas históricas¶

  • Sound recording and reproduction
  • Timeline of audio formats
  • British Library Sounds